package com.qf.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 自定义工厂类
 */
public class MyFactory {
    //声明一个实例变量，用来加载 配置文件
    private Properties properties;

    //对象的缓存
    private Map<String,Object> casheMap = new HashMap<String,Object>();



    //初始化 properties
    public MyFactory() throws IOException {
        this.properties = new Properties();
        //把配置文件转换成输入流对象
        InputStream in = this.getClass().getResourceAsStream("/beans.properties");
        properties.load(in);
    }

    //提供一个带 参数的构造函数，参数代表配置文件的位置
    //面向对象：封装、继承、多态：重载属于多态的一种
    public MyFactory(String configfile) throws IOException {
        this.properties = new Properties();
        //把配置文件转换成输入流对象
        InputStream in = this.getClass().getResourceAsStream(configfile);
        properties.load(in);
    }



    //暴露一个创建对象的方法
    public Object getBean(String beanName) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        //从缓存中获取对象，获取到了就直接返回
        Object o = casheMap.get(beanName);
        if(o == null){
            //查找 beanName 所对应的 类的全限定名
            String  className = getBeanClassName(beanName);
            //反射创建对象
            Class<?> clazz = Class.forName(className);
            o = clazz.newInstance();
            //新创建的对象加入缓存
            casheMap.put(beanName,o);
        }

        return o;
    }
    //根据 key 返回 value
    private String getBeanClassName(String beanName) {
        String property = properties.getProperty(beanName);
        return property;
    }
}
